package com.example.javamaday.encrypt_decrypt;

import android.support.annotation.RequiresApi;

import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * Des加密Demo
 */
public class DesEncryptDemo {

    @RequiresApi(api = 26)
    public static void main(String[] args) throws Exception {
        decode(encode());
    }

    @RequiresApi(api = 26)
    private static byte[] encode() throws Exception {
        String input = "RenHui"; // 原文
        String key = "12345678";  // 密钥 （注意：Des的加密Key必须是8位）
        String transformation = "DES";  // 算法
        String algorithm = "DES";

        Cipher cipher = Cipher.getInstance(transformation);
        /**
         * 创建加密规则，第一个参数表示key的字节，第二个参数表示加密的类型。
         */
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
        /**
         * 进行加密初始化，第一个参数表示模式，第二个参数表示加密的规则
         */
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        // 调用加密的方法, 参数为原文的字节数组
        byte[] bytes = cipher.doFinal(input.getBytes());
        // 打印密文 (如果直接打印密文，会出现乱码) 一般会配合Base64进行使用
        System.out.println(new String(bytes));

        // 使用Base64加密后，在打印密文
        byte[] enCode = Base64.getEncoder().encode(bytes);
        System.out.println("Encode Content = " + new String(enCode));
        return enCode;
    }

    @RequiresApi(api = 26)
    private static void decode(byte[] encodeContent) throws Exception {
        String key = "12345678";  // 密钥 （注意：Des的加密Key必须是8位）
        String transformation = "DES";  // 算法
        String algorithm = "DES";
        Cipher cipher = Cipher.getInstance(transformation);

        /**
         * 创建加密规则，第一个参数表示key的字节，第二个参数表示加密的类型。
         */
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
        /**
         * 进行加密初始化，第一个参数表示模式，第二个参数表示加密的规则
         */
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        // 调用加密的方法, 参数为原文的字节数组
        byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(encodeContent));
        System.out.println("Decode Content = " + new String(bytes));
    }
}
